home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / net / RCS / res_debug.c,v < prev    next >
Text File  |  1988-07-29  |  11KB  |  578 lines

  1. head     1.3;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @ * @;
  6.  
  7.  
  8. 1.3
  9. date     88.07.29.18.32.29;  author ouster;  state Exp;
  10. branches ;
  11. next     1.2;
  12.  
  13. 1.2
  14. date     88.07.29.16.59.52;  author ouster;  state Exp;
  15. branches ;
  16. next     1.1;
  17.  
  18. 1.1
  19. date     88.06.20.09.57.17;  author ouster;  state Exp;
  20. branches ;
  21. next     ;
  22.  
  23.  
  24. desc
  25. @@
  26.  
  27.  
  28. 1.3
  29. log
  30. @Lint.
  31. @
  32. text
  33. @/*
  34.  * Copyright (c) 1985 Regents of the University of California.
  35.  * All rights reserved.
  36.  *
  37.  * Redistribution and use in source and binary forms are permitted
  38.  * provided that this notice is preserved and that due credit is given
  39.  * to the University of California at Berkeley. The name of the University
  40.  * may not be used to endorse or promote products derived from this
  41.  * software without specific prior written permission. This software
  42.  * is provided ``as is'' without express or implied warranty.
  43.  */
  44.  
  45. #if defined(LIBC_SCCS) && !defined(lint)
  46. static char sccsid[] = "@@(#)res_debug.c    5.23 (Berkeley) 5/19/88";
  47. #endif /* LIBC_SCCS and not lint */
  48.  
  49. #if defined(lint) && !defined(DEBUG)
  50. #define DEBUG
  51. #endif
  52.  
  53. #include <sys/types.h>
  54. #include <netinet/in.h>
  55. #include <stdio.h>
  56. #include <arpa/nameser.h>
  57.  
  58. extern char *p_cdname(), *p_rr(), *p_type(), *p_class(), *p_time();
  59. extern char *inet_ntoa();
  60.  
  61. char *_res_opcodes[] = {
  62.     "QUERY",
  63.     "IQUERY",
  64.     "CQUERYM",
  65.     "CQUERYU",
  66.     "4",
  67.     "5",
  68.     "6",
  69.     "7",
  70.     "8",
  71.     "UPDATEA",
  72.     "UPDATED",
  73.     "UPDATEDA",
  74.     "UPDATEM",
  75.     "UPDATEMA",
  76.     "ZONEINIT",
  77.     "ZONEREF",
  78. };
  79.  
  80. char *_res_resultcodes[] = {
  81.     "NOERROR",
  82.     "FORMERR",
  83.     "SERVFAIL",
  84.     "NXDOMAIN",
  85.     "NOTIMP",
  86.     "REFUSED",
  87.     "6",
  88.     "7",
  89.     "8",
  90.     "9",
  91.     "10",
  92.     "11",
  93.     "12",
  94.     "13",
  95.     "14",
  96.     "NOCHANGE",
  97. };
  98.  
  99. p_query(msg)
  100.     char *msg;
  101. {
  102. #ifdef DEBUG
  103.     fp_query(msg,stdout);
  104. #endif
  105. }
  106.  
  107. /*
  108.  * Print the contents of a query.
  109.  * This is intended to be primarily a debugging routine.
  110.  */
  111. fp_query(msg,file)
  112.     char *msg;
  113.     FILE *file;
  114. {
  115. #ifdef DEBUG
  116.     register char *cp;
  117.     register HEADER *hp;
  118.     register int n;
  119.  
  120.     /*
  121.      * Print header fields.
  122.      */
  123.     hp = (HEADER *)msg;
  124.     cp = msg + sizeof(HEADER);
  125.     fprintf(file,"HEADER:\n");
  126.     fprintf(file,"\topcode = %s", _res_opcodes[hp->opcode]);
  127.     fprintf(file,", id = %d", ntohs(hp->id));
  128.     fprintf(file,", rcode = %s\n", _res_resultcodes[hp->rcode]);
  129.     fprintf(file,"\theader flags: ");
  130.     if (hp->qr)
  131.         fprintf(file," qr");
  132.     if (hp->aa)
  133.         fprintf(file," aa");
  134.     if (hp->tc)
  135.         fprintf(file," tc");
  136.     if (hp->rd)
  137.         fprintf(file," rd");
  138.     if (hp->ra)
  139.         fprintf(file," ra");
  140.     if (hp->pr)
  141.         fprintf(file," pr");
  142.     fprintf(file,"\n\tqdcount = %d", ntohs(hp->qdcount));
  143.     fprintf(file,", ancount = %d", ntohs(hp->ancount));
  144.     fprintf(file,", nscount = %d", ntohs(hp->nscount));
  145.     fprintf(file,", arcount = %d\n\n", ntohs(hp->arcount));
  146.     /*
  147.      * Print question records.
  148.      */
  149.     if (n = ntohs(hp->qdcount)) {
  150.         fprintf(file,"QUESTIONS:\n");
  151.         while (--n >= 0) {
  152.             fprintf(file,"\t");
  153.             cp = p_cdname(cp, msg, file);
  154.             if (cp == NULL)
  155.                 return;
  156.             fprintf(file,", type = %s",
  157.                 p_type((int) _getshort((u_char *) cp)));
  158.             cp += sizeof(u_short);
  159.             fprintf(file,", class = %s\n\n",
  160.                 p_class((int) (_getshort((u_char *) cp))));
  161.             cp += sizeof(u_short);
  162.         }
  163.     }
  164.     /*
  165.      * Print authoritative answer records
  166.      */
  167.     if (n = ntohs(hp->ancount)) {
  168.         fprintf(file,"ANSWERS:\n");
  169.         while (--n >= 0) {
  170.             fprintf(file,"\t");
  171.             cp = p_rr(cp, msg, file);
  172.             if (cp == NULL)
  173.                 return;
  174.         }
  175.     }
  176.     /*
  177.      * print name server records
  178.      */
  179.     if (n = ntohs(hp->nscount)) {
  180.         fprintf(file,"NAME SERVERS:\n");
  181.         while (--n >= 0) {
  182.             fprintf(file,"\t");
  183.             cp = p_rr(cp, msg, file);
  184.             if (cp == NULL)
  185.                 return;
  186.         }
  187.     }
  188.     /*
  189.      * print additional records
  190.      */
  191.     if (n = ntohs(hp->arcount)) {
  192.         fprintf(file,"ADDITIONAL RECORDS:\n");
  193.         while (--n >= 0) {
  194.             fprintf(file,"\t");
  195.             cp = p_rr(cp, msg, file);
  196.             if (cp == NULL)
  197.                 return;
  198.         }
  199.     }
  200. #endif
  201. }
  202.  
  203. char *
  204. p_cdname(cp, msg, file)
  205.     char *cp, *msg;
  206.     FILE *file;
  207. {
  208. #ifdef DEBUG
  209.     char name[MAXDNAME];
  210.     int n;
  211.  
  212.     if ((n = dn_expand((u_char *) msg, (u_char *) (msg + 512),
  213.         (u_char *) cp, (u_char *) name, sizeof(name))) < 0)
  214.         return (NULL);
  215.     if (name[0] == '\0') {
  216.         name[0] = '.';
  217.         name[1] = '\0';
  218.     }
  219.     fputs(name, file);
  220.     return (cp + n);
  221. #endif
  222. }
  223.  
  224. /*
  225.  * Print resource record fields in human readable form.
  226.  */
  227. char *
  228. p_rr(cp, msg, file)
  229.     char *cp, *msg;
  230.     FILE *file;
  231. {
  232. #ifdef DEBUG
  233.     int type, class, dlen, n, c;
  234.     struct in_addr inaddr;
  235.     char *cp1;
  236.  
  237.     if ((cp = p_cdname(cp, msg, file)) == NULL)
  238.         return (NULL);            /* compression error */
  239.     fprintf(file,"\n\ttype = %s", p_type(type = _getshort((u_char *)cp)));
  240.     cp += sizeof(u_short);
  241.     fprintf(file,", class = %s", p_class(class = _getshort((u_char *)cp)));
  242.     cp += sizeof(u_short);
  243.     fprintf(file,", ttl = %s", p_time((u_long) cp));
  244.     cp += sizeof(u_long);
  245.     fprintf(file,", dlen = %d\n", dlen = _getshort((u_char *)cp));
  246.     cp += sizeof(u_short);
  247.     cp1 = cp;
  248.     /*
  249.      * Print type specific data, if appropriate
  250.      */
  251.     switch (type) {
  252.     case T_A:
  253.         switch (class) {
  254.         case C_IN:
  255.             bcopy(cp, (char *)&inaddr, sizeof(inaddr));
  256.             if (dlen == 4) {
  257.                 fprintf(file,"\tinternet address = %s\n",
  258.                     inet_ntoa(inaddr));
  259.                 cp += dlen;
  260.             } else if (dlen == 7) {
  261.                 fprintf(file,"\tinternet address = %s",
  262.                     inet_ntoa(inaddr));
  263.                 fprintf(file,", protocol = %d", cp[4]);
  264.                 fprintf(file,", port = %d\n",
  265.                     (cp[5] << 8) + cp[6]);
  266.                 cp += dlen;
  267.             }
  268.             break;
  269.         default:
  270.             cp += dlen;
  271.         }
  272.         break;
  273.     case T_CNAME:
  274.     case T_MB:
  275. #ifdef OLDRR
  276.     case T_MD:
  277.     case T_MF:
  278. #endif /* OLDRR */
  279.     case T_MG:
  280.     case T_MR:
  281.     case T_NS:
  282.     case T_PTR:
  283.         fprintf(file,"\tdomain name = ");
  284.         cp = p_cdname(cp, msg, file);
  285.         fprintf(file,"\n");
  286.         break;
  287.  
  288.     case T_HINFO:
  289.         if (n = *cp++) {
  290.             fprintf(file,"\tCPU=%.*s\n", n, cp);
  291.             cp += n;
  292.         }
  293.         if (n = *cp++) {
  294.             fprintf(file,"\tOS=%.*s\n", n, cp);
  295.             cp += n;
  296.         }
  297.         break;
  298.  
  299.     case T_SOA:
  300.         fprintf(file,"\torigin = ");
  301.         cp = p_cdname(cp, msg, file);
  302.         fprintf(file,"\n\tmail addr = ");
  303.         cp = p_cdname(cp, msg, file);
  304.         fprintf(file,"\n\tserial=%ld", _getlong((u_char *)cp));
  305.         cp += sizeof(u_long);
  306.         fprintf(file,", refresh=%s", p_time((u_long) cp));
  307.         cp += sizeof(u_long);
  308.         fprintf(file,", retry=%s", p_time((u_long) cp));
  309.         cp += sizeof(u_long);
  310.         fprintf(file,", expire=%s", p_time((u_long) cp));
  311.         cp += sizeof(u_long);
  312.         fprintf(file,", min=%s\n", p_time((u_long) cp));
  313.         cp += sizeof(u_long);
  314.         break;
  315.  
  316.     case T_MX:
  317.         fprintf(file,"\tpreference = %ld,",_getshort((u_char *)cp));
  318.         cp += sizeof(u_short);
  319.         fprintf(file," name = ");
  320.         cp = p_cdname(cp, msg, file);
  321.         break;
  322.  
  323.     case T_MINFO:
  324.         fprintf(file,"\trequests = ");
  325.         cp = p_cdname(cp, msg, file);
  326.         fprintf(file,"\n\terrors = ");
  327.         cp = p_cdname(cp, msg, file);
  328.         break;
  329.  
  330.     case T_UINFO:
  331.         fprintf(file,"\t%s\n", cp);
  332.         cp += dlen;
  333.         break;
  334.  
  335.     case T_UID:
  336.     case T_GID:
  337.         if (dlen == 4) {
  338.             fprintf(file,"\t%ld\n", _getlong((u_char *) cp));
  339.             cp += sizeof(int);
  340.         }
  341.         break;
  342.  
  343.     case T_WKS:
  344.         if (dlen < sizeof(u_long) + 1)
  345.             break;
  346.         bcopy(cp, (char *)&inaddr, sizeof(inaddr));
  347.         cp += sizeof(u_long);
  348.         fprintf(file,"\tinternet address = %s, protocol = %d\n\t",
  349.             inet_ntoa(inaddr), *cp++);
  350.         n = 0;
  351.         while (cp < cp1 + dlen) {
  352.             c = *cp++;
  353.             do {
  354.                  if (c & 0200)
  355.                     fprintf(file," %d", n);
  356.                  c <<= 1;
  357.             } while (++n & 07);
  358.         }
  359.         putc('\n',file);
  360.         break;
  361.  
  362. #ifdef ALLOW_T_UNSPEC
  363.     case T_UNSPEC:
  364.         {
  365.             int NumBytes = 8;
  366.             char *DataPtr;
  367.             int i;
  368.  
  369.             if (dlen < NumBytes) NumBytes = dlen;
  370.             fprintf(file, "\tFirst %d bytes of hex data:",
  371.                 NumBytes);
  372.             for (i = 0, DataPtr = cp; i < NumBytes; i++, DataPtr++)
  373.                 fprintf(file, " %x", *DataPtr);
  374.             fputs("\n", file);
  375.             cp += dlen;
  376.         }
  377.         break;
  378. #endif /* ALLOW_T_UNSPEC */
  379.  
  380.     default:
  381.         fprintf(file,"\t???\n");
  382.         cp += dlen;
  383.     }
  384.     if (cp != cp1 + dlen)
  385.         fprintf(file,"packet size error (%#x != %#x)\n", cp, cp1+dlen);
  386.     fprintf(file,"\n");
  387.     return (cp);
  388. #endif
  389. }
  390.  
  391. static    char nbuf[40];
  392.  
  393. /*
  394.  * Return a string for the type
  395.  */
  396. char *
  397. p_type(type)
  398.     int type;
  399. {
  400.     switch (type) {
  401.     case T_A:
  402.         return("A");
  403.     case T_NS:        /* authoritative server */
  404.         return("NS");
  405. #ifdef OLDRR
  406.     case T_MD:        /* mail destination */
  407.         return("MD");
  408.     case T_MF:        /* mail forwarder */
  409.         return("MF");
  410. #endif /* OLDRR */
  411.     case T_CNAME:        /* connonical name */
  412.         return("CNAME");
  413.     case T_SOA:        /* start of authority zone */
  414.         return("SOA");
  415.     case T_MB:        /* mailbox domain name */
  416.         return("MB");
  417.     case T_MG:        /* mail group member */
  418.         return("MG");
  419.     case T_MX:        /* mail routing info */
  420.         return("MX");
  421.     case T_MR:        /* mail rename name */
  422.         return("MR");
  423.     case T_NULL:        /* null resource record */
  424.         return("NULL");
  425.     case T_WKS:        /* well known service */
  426.         return("WKS");
  427.     case T_PTR:        /* domain name pointer */
  428.         return("PTR");
  429.     case T_HINFO:        /* host information */
  430.         return("HINFO");
  431.     case T_MINFO:        /* mailbox information */
  432.         return("MINFO");
  433.     case T_AXFR:        /* zone transfer */
  434.         return("AXFR");
  435.     case T_MAILB:        /* mail box */
  436.         return("MAILB");
  437.     case T_MAILA:        /* mail address */
  438.         return("MAILA");
  439.     case T_ANY:        /* matches any type */
  440.         return("ANY");
  441.     case T_UINFO:
  442.         return("UINFO");
  443.     case T_UID:
  444.         return("UID");
  445.     case T_GID:
  446.         return("GID");
  447. #ifdef ALLOW_T_UNSPEC
  448.     case T_UNSPEC:
  449.         return("UNSPEC");
  450. #endif /* ALLOW_T_UNSPEC */
  451.     default:
  452.         (void)sprintf(nbuf, "%d", type);
  453.         return(nbuf);
  454.     }
  455. }
  456.  
  457. /*
  458.  * Return a mnemonic for class
  459.  */
  460. char *
  461. p_class(class)
  462.     int class;
  463. {
  464.  
  465.     switch (class) {
  466.     case C_IN:        /* internet class */
  467.         return("IN");
  468.     case C_ANY:        /* matches any class */
  469.         return("ANY");
  470.     default:
  471.         (void)sprintf(nbuf, "%d", class);
  472.         return(nbuf);
  473.     }
  474. }
  475.  
  476. /*
  477.  * Return a mnemonic for a time to live
  478.  */
  479. char
  480. *p_time(value)
  481.     u_long value;
  482. {
  483.     int secs, mins, hours;
  484.     register char *p;
  485.  
  486.     secs = value % 60;
  487.     value /= 60;
  488.     mins = value % 60;
  489.     value /= 60;
  490.     hours = value % 24;
  491.     value /= 24;
  492.  
  493. #define    PLURALIZE(x)    x, (x == 1) ? "" : "s"
  494.     p = nbuf;
  495.     if (value) {
  496.         (void)sprintf(p, "%d day%s", PLURALIZE(value));
  497.         while (*++p);
  498.     }
  499.     if (hours) {
  500.         if (p != nbuf)
  501.             *p++ = ' ';
  502.         (void)sprintf(p, "%d hour%s", PLURALIZE(hours));
  503.         while (*++p);
  504.     }
  505.     if (mins) {
  506.         if (p != nbuf)
  507.             *p++ = ' ';
  508.         (void)sprintf(p, "%d min%s", PLURALIZE(mins));
  509.         while (*++p);
  510.     }
  511.     if (secs) {
  512.         if (p != nbuf)
  513.             *p++ = ' ';
  514.         (void)sprintf(p, "%d sec%s", PLURALIZE(secs));
  515.         while (*++p);
  516.     }
  517.     return(nbuf);
  518. }
  519. @
  520.  
  521.  
  522. 1.2
  523. log
  524. @Lint.
  525. @
  526. text
  527. @d127 2
  528. a128 1
  529.             fprintf(file,", class = %s\n\n", p_class(_getshort(cp)));
  530. @
  531.  
  532.  
  533. 1.1
  534. log
  535. @Initial revision
  536. @
  537. text
  538. @d124 2
  539. a125 1
  540.             fprintf(file,", type = %s", p_type(_getshort(cp)));
  541. d179 2
  542. a180 1
  543.     if ((n = dn_expand(msg, msg + 512, cp, name, sizeof(name))) < 0)
  544. d206 1
  545. a206 1
  546.     fprintf(file,"\n\ttype = %s", p_type(type = _getshort(cp)));
  547. d208 1
  548. a208 1
  549.     fprintf(file,", class = %s", p_class(class = _getshort(cp)));
  550. d210 1
  551. a210 1
  552.     fprintf(file,", ttl = %s", p_time(cp));
  553. d212 1
  554. a212 1
  555.     fprintf(file,", dlen = %d\n", dlen = _getshort(cp));
  556. d271 1
  557. a271 1
  558.         fprintf(file,"\n\tserial=%ld", _getlong(cp));
  559. d273 1
  560. a273 1
  561.         fprintf(file,", refresh=%s", p_time(cp));
  562. d275 1
  563. a275 1
  564.         fprintf(file,", retry=%s", p_time(cp));
  565. d277 1
  566. a277 1
  567.         fprintf(file,", expire=%s", p_time(cp));
  568. d279 1
  569. a279 1
  570.         fprintf(file,", min=%s\n", p_time(cp));
  571. d284 1
  572. a284 1
  573.         fprintf(file,"\tpreference = %ld,",_getshort(cp));
  574. d305 1
  575. a305 1
  576.             fprintf(file,"\t%ld\n", _getlong(cp));
  577. @
  578.